/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.sistema.gestionuniversitaria.dataLayer;

import com.sistema.gestionuniversitaria.BusinessLayer.Alumno;
import com.sistema.gestionuniversitaria.BusinessLayer.Carrera;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.Date;
import oracle.jdbc.OracleTypes;

/**
 *
 * @author PERSONAL
 */
public class AlumnoData extends BaseData {

    ArrayList<Alumno> alumnos;

    public AlumnoData() {
    }

    public Alumno getAlumnoPOrCedula(String cedula) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }

        CallableStatement cstmt = null;
        ResultSet resultSet = null;
        Alumno alumno = new Alumno();

        try {
            cstmt = conexion.prepareCall("{?=call BUSCARALUMNOPORCEDULA (?)}");
            cstmt.registerOutParameter(1, OracleTypes.CURSOR);
            cstmt.setString(2, cedula);
            cstmt.execute();
            resultSet = (ResultSet) cstmt.getObject(1);

            if (resultSet.next()) {
                alumno.setCedula(resultSet.getString("cedula"));
                alumno.setNombre(resultSet.getString("nombre"));
                alumno.setApellidos(resultSet.getString("apellidos"));
                alumno.setTelefono(resultSet.getString("telefono"));
                alumno.setEmail(resultSet.getString("email"));
                alumno.setFechaNacimiento(resultSet.getDate("fecha_nacimiento"));
                Carrera carr = new Carrera();
                String codigo = resultSet.getString("cod_carrera");
                carr.setCodigo(codigo);
                alumno.setCarrera(carr);
            }
        } catch (SQLException e) {
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (cstmt != null) {
                    cstmt.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }

        return alumno;
    }

    public ArrayList<Alumno> getAlumnoPOrCarrera(String codCarrera) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }

        CallableStatement cstmt = null;
        ResultSet resultSet = null;
        try {
            cstmt = conexion.prepareCall("{?=call BUSCAR_ALUMNO_POR_CARRERA (?)}");
            cstmt.registerOutParameter(1, OracleTypes.CURSOR);
            cstmt.setString(2, codCarrera);
            cstmt.execute();
            resultSet = (ResultSet) cstmt.getObject(1);

            while (resultSet.next()) {
                Alumno alumno = new Alumno();
                alumno.setCedula(resultSet.getString("cedula"));
                alumno.setNombre(resultSet.getString("nombre"));
                alumno.setApellidos(resultSet.getString("apellidos"));
                alumno.setTelefono(resultSet.getString("telefono"));
                alumno.setEmail(resultSet.getString("email"));
                alumno.setFechaNacimiento(resultSet.getDate("fecha_nacimiento"));
                alumnos.add(alumno);
            }
        } catch (SQLException e) {
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (cstmt != null) {
                    cstmt.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }

        return alumnos;
    }

    public ArrayList<Alumno> getAlumnoPOrNombre(String nombre) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        String sqlSelectAlumno = "SELECT cedula,nombre,apellidos,telefono,email,fecha_nacimiento FROM ALUMNO WHERE nombre like '%" + nombre + "%'";

        PreparedStatement statement = null;
        ResultSet resultSet = null;
        alumnos = new ArrayList<Alumno>();

        try {
            statement = conexion.prepareStatement(sqlSelectAlumno);
            resultSet = statement.executeQuery();

            while (resultSet.next()) {
                Alumno alumno = new Alumno();
                alumno.setCedula(resultSet.getString("cedula"));
                alumno.setNombre(resultSet.getString("nombre"));
                alumno.setApellidos(resultSet.getString("apellidos"));
                alumno.setTelefono(resultSet.getString("telefono"));
                alumno.setEmail(resultSet.getString("email"));
                alumno.setFechaNacimiento(resultSet.getDate("fecha_nacimiento"));
                alumnos.add(alumno);
            }
        } catch (SQLException e) {
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }

        return alumnos;
    }

    public void insertarAlumno(String cedula, String nombre, String apellidos, String telefono, String email, String fechaNacimiento, String codCarrera) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
        Date d = null;
        try {
            d = sdf.parse(fechaNacimiento);
        } catch (ParseException ex) {
            throw new ExcepcionGlobal("Datos no validos o nulos");
        }
        CallableStatement cstmtInsertarAlumno = null;
        try {
            cstmtInsertarAlumno = conexion.prepareCall("{call INSERTAR_ALUMNO (?,?,?,?,?,?,?)}");
            cstmtInsertarAlumno.setString(1, cedula);
            cstmtInsertarAlumno.setString(2, nombre);
            cstmtInsertarAlumno.setString(3, apellidos);
            cstmtInsertarAlumno.setString(4, telefono);
            cstmtInsertarAlumno.setString(5, email);
            cstmtInsertarAlumno.setString(6, sdf.format(d));
            cstmtInsertarAlumno.setString(7, codCarrera);
            boolean resultado = cstmtInsertarAlumno.execute();
            if (resultado == true) {
                throw new NoDataException("No se realizo la inserción");
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (cstmtInsertarAlumno != null) {
                    cstmtInsertarAlumno.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }
    }

    public void eliminarAlumno(String cedula) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmtInsertarCarrera = null;
        try {
            cstmtInsertarCarrera = conexion.prepareCall("{call ELIMINAR_ALUMNO (?)}");
            cstmtInsertarCarrera.setString(1, cedula);
            boolean resultado = cstmtInsertarCarrera.execute();
            if (resultado == true) {
                throw new NoDataException("No se realizo la operación");
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (cstmtInsertarCarrera != null) {
                    cstmtInsertarCarrera.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }
    }

    public void actualizarAlumno(String cedula, String nombre, String apellidos, String telefono, String email, String fechaNacimiento) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
        Date d = null;
        try {
            d = sdf.parse(fechaNacimiento);
        } catch (ParseException ex) {
            throw new ExcepcionGlobal("Datos no validos o nulos");
        }
        CallableStatement cstmtInsertarAlumno = null;
        try {
            cstmtInsertarAlumno = conexion.prepareCall("{call ACTUALIZAR_ALUMNO (?,?,?,?,?,?)}");
            cstmtInsertarAlumno.setString(1, cedula);
            cstmtInsertarAlumno.setString(2, nombre);
            cstmtInsertarAlumno.setString(3, apellidos);
            cstmtInsertarAlumno.setString(4, telefono);
            cstmtInsertarAlumno.setString(5, email);
            cstmtInsertarAlumno.setString(6, sdf.format(d));
            boolean resultado = cstmtInsertarAlumno.execute();
            if (resultado == true) {
                throw new NoDataException("No se realizo la inserción");
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (cstmtInsertarAlumno != null) {
                    cstmtInsertarAlumno.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }
    }
}
